/*
 * 文件名：CommonDaoImp.java
 * 版权：Copyright by www.wootide.com
 * 描述：
 * 修改人：ozm
 * 修改时间：2013-1-28
 * 跟踪单号：
 * 修改单号：
 * 修改内容：
 */
package com.wootide.ets.common.dao.imp;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.wootide.ets.common.Page;
import com.wootide.ets.common.QueryCondition;
import com.wootide.ets.common.QueryResults;
import com.wootide.ets.common.dao.CommonDao;
import com.wootide.ets.common.util.CommonUtil;
import com.wootide.ets.log.syslog.RunLog;

public class CommonDaoImp extends HibernateDaoSupport  implements CommonDao
{
    //日志对象
    private RunLog runLog;
   

    /**
     * 
     * Description: 分页查询,仅适用于==和like条件
     * Implement: <br>
     * @param page  分页信息
     * @param queryConditon 查询条件
     * @see
     * @return QueryResults 结果集
     * @author ozm2013-1-28下午4:04:03
     */
    @SuppressWarnings("unchecked")
    public QueryResults queryForPages(final Page page, final QueryCondition queryConditon)
    {
        // 打印方法入口参数
        runLog.debug("page=" + page);
        runLog.debug("queryConditon" + queryConditon);

        @SuppressWarnings("rawtypes")
        List queryResults = (List) getHibernateTemplate().execute(
                new HibernateCallback()
                {
                    public Object doInHibernate(Session session)
                        throws SQLException
                    {
                        Criteria criteria = session
                                .createCriteria(queryConditon.getObjClass());
                        
                        // 如果查询条件不为空
                        if (CommonUtil.conditionExist(queryConditon))
                        {
                            String strCondition = "%"
                                    + queryConditon.getValue().trim() + "%";
                            String conditionKey = queryConditon.getKey();
                            criteria.add(Restrictions.ilike(conditionKey, strCondition));
                        }
//                        if (null != queryConditon)
//                        {
//                            List  conditionKeyList = queryConditon.getConditionKeyList();
//                            
//                            if (!CommonUtil.collectionIsNull(conditionKeyList))
//                            {
//                                //查询条件不为空
////                                Map conditionMap = queryConditon.getConditionMap();
//                                for (String conditionKey : queryConditon.getConditionKeyList())
//                                {
//                                    conditionKeyList.indexOf(conditionKey);
//                                    //添加查询条件
////                                    criteria.add(Restrictions.ilike(conditionKey, conditionMap.get(conditionKey)));
//                                }
//                            }
//                            
//                            if (!CommonUtil.collectionIsNull(queryConditon.getOrderDescList()))
//                            {
//                                //添加降序字段
//                                for (String descStr : queryConditon.getOrderDescList())
//                                {
//                                    criteria.addOrder(Order.desc(descStr));
//                                }
//                            }
//                            
//                            if (!CommonUtil.collectionIsNull(queryConditon.getOrderAscList()))
//                            {
//                                //添加升序字段
//                                for (String ascStr : queryConditon.getOrderAscList())
//                                {
//                                    criteria.addOrder(Order.asc(ascStr));
//                                }
//                            }
//                        }
////                     
                        // 获得总记录数
                        criteria.setProjection(null);  
                        int totalNum = ((Number) criteria
                                .setProjection(Projections.rowCount()).list().get(0)).intValue();
                        page.setTotalNum(totalNum);

                        criteria.setProjection(null);  
                        // 获得分页查询数据
                        List results = criteria.setMaxResults(page.getNumPerPage())
                                .setFirstResult(page.getFirstResult()).list();
                        return results;
                    }
                });
        QueryResults result = new QueryResults();
        result.setResults(queryResults);
        result.setPage(page);
        return result;
    }
    
    /**
     * 添加一个对象
     * Description: <br>
     * Implement: <br>
     * @param obj 新增的用户信息
     * @see
     * @return void
     * @author ozm
     */
    public void addOneObject(Object obj)
    {
        runLog.debug("obj=" + obj);
        
        this.getHibernateTemplate().save(obj);
    }
    
    /**
     * 修改一个对象
     * Description: <br>
     * Implement: <br>
     * @param obj 需要修改对象
     * @see
     * @return void
     * @author ozm
     */
    public void modOneObject(Object obj)
    {
        runLog.debug("obj=" + obj);
        this.getHibernateTemplate().update(obj);
    }
    
    /**
     * 删除一个对象
     * Description: <br>
     * Implement: <br>
     * @param obj 需要删除对象
     * @see
     * @return void
     * @author ozm
     */
    public void delOneObject(Object obj)
    {
        runLog.debug("obj=" + obj);
        
        this.getHibernateTemplate().delete(obj);  
    }
    
    public RunLog getRunLog()
    {
        return runLog;
    }

    public void setRunLog(RunLog runLog)
    {
        this.runLog = runLog;
    }
}
